﻿/************************************************************************
** 文  件：
**	RecordManager.h
** 功  能：
**	录像管理类
** 作  者：
**	email:lixx2048@163.com
**  wechat:lixiang6153
**  QQ:941415509
** 日  期：
**	2024/03/15	14:00:00
** 说  明：
**	无
** 版  本：
**	2024/03/15	14:00:00		1.0		lixx2048@163.com
/************************************************************************/
#pragma once
#include <string>
#include <memory>
#include <queue>
#include <thread>
#include <unordered_map>
#include "AlarmRecord.h"
#include "ManualRecord.h"

class RecordManager
{
	// 预录队列
	typedef std::queue<cv::Mat> IMAGE_QUEUE;
	// 录像列表
	typedef std::unordered_map<std::string, RecordPtr> RECORDS;
public:
	RecordManager();
	virtual ~RecordManager();

public:
	// 视频初始化
	void Init(int fps, int width, int height);
	// 启动服务
	void Start();
	// 停止服务
	void Stop();

public:
	// 启动报警录像
	void StartAlarmRecord(std::string id, std::string deviceId, int duration, ALARM_RC_CB cb);
	// 启动手动录像
	bool StartManualRecord(std::string id, std::string deviceId, std::string name, int duration, EVENT_RC_CB cb, bool event = true);
	// 停止手动录像
	void StopManualRecord(std::string id);
	// 开始手动抓拍
	bool StartManualCapture(std::string id);
	// 输入视频帧
	void InputFrame(cv::Mat& frame);
	// 是否有手动录像
	bool HasManualRecord();

protected:
	// 视频帧率
	int m_fps = 25;
	// 视频宽度
	int m_width = 0;
	// 视频高度
	int m_height = 0;
	// 预录帧数
	int m_pre_frame = 0;
	// 录制设备
	std::string m_deviceId = "";
	// 队列大锁
	std::mutex m_queue_lock;
	// 预录队列
	IMAGE_QUEUE m_pre_queue = {};
	// 视频缓存
	IMAGE_QUEUE m_image_queue = {};
	// 录像列表
	RECORDS m_record_map = {};
	// 录像大锁
	std::mutex m_record_lock;
	// 初始标志
	bool m_init = false;
	// 有手动录像
	bool m_event_record = false;
	// 运行标志
	bool m_run = true;
	// 录像线程
	std::thread m_thread;
};

typedef std::shared_ptr<RecordManager> RecordManagerPtr;